package com.youlai.boot.system.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.IdUtil;
import com.youlai.boot.common.exception.BusinessException;
import com.youlai.boot.core.security.util.SecurityUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.boot.system.mapper.TomTableMapper;
import com.youlai.boot.system.service.TomTableService;
import com.youlai.boot.system.model.entity.TomTable;
import com.youlai.boot.system.model.form.TomTableForm;
import com.youlai.boot.system.model.query.TomTableQuery;
import com.youlai.boot.system.model.vo.TomTableVO;
import com.youlai.boot.system.converter.TomTableConverter;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import org.springframework.transaction.annotation.Transactional;

/**
 * 汤姆代取服务实现类
 *
 * @author youlaitech
 * @since 2025-09-16 22:36
 */
@Service
@RequiredArgsConstructor
public class TomTableServiceImpl extends ServiceImpl<TomTableMapper, TomTable> implements TomTableService {

    private final TomTableConverter tomTableConverter;

    /**
     * 获取汤姆代取分页列表
     *
     * @param queryParams 查询参数
     * @return {@link IPage<TomTableVO>} 汤姆代取分页列表
     */
    @Override
    public IPage<TomTableVO> getTomTablePage(TomTableQuery queryParams) {
        Page<TomTableVO> pageVO = this.baseMapper.getTomTablePage(
                new Page<>(queryParams.getPageNum(), queryParams.getPageSize()),
                queryParams
        );
        return pageVO;
    }

    /**
     * 获取汤姆代取表单数据
     *
     * @param id 汤姆代取ID
     * @return
     */
    @Override
    public TomTableForm getTomTableFormData(Long id) {
        TomTable entity = this.getById(id);
        return tomTableConverter.toForm(entity);
    }

    /**
     * 新增汤姆代取
     *
     * @param formData 汤姆代取表单对象
     * @return
     */

    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveTomTable(TomTableForm formData) {
        // 验证数据
        if (StrUtil.isBlank(formData.getRemark())) {
            throw new BusinessException("识别内容数据不能为空!");
        }

        // 解析备注内容：按照\n分割，最后一行是送达地址
        String[] remarkLines = formData.getRemark().split("\n");
        if (remarkLines.length == 0) {
            throw new BusinessException("备注内容不能为空!");
        }

        // 提取送达地址（最后一行）
        String dz = remarkLines[remarkLines.length - 1];
        if (StrUtil.isBlank(dz)) {
            throw new BusinessException("送达地址不能为空!");
        }
        List<String> qjmList = Arrays.stream(Arrays.copyOfRange(remarkLines, 0, remarkLines.length - 1))
                .filter(StrUtil::isNotBlank)    // 过滤空行
                .map(String::trim)              // 去除首尾空格
                .sorted()                       // 按取件码排序
                .toList();

        if (CollUtil.isEmpty(qjmList)) {
            throw new BusinessException("取件码数据不能为空!");
        }
        Long userId = SecurityUtils.getUserId();
        // 构建实体列表
        List<TomTable> entityList = qjmList.stream()
                .map(item -> {
                    TomTable entity = new TomTable();
                    entity.setId(IdUtil.getSnowflakeNextId());
                    entity.setZdId(formData.getZdId());
                    entity.setZdName(formData.getZdName());
                    entity.setQjm(item);
                    // 去除特殊字符，只保留数字
                    String cleanedQjm = item.replaceAll("[^0-9]", "");
                    if (StrUtil.isNotBlank(cleanedQjm)){
                        entity.setQjm1(Long.valueOf(cleanedQjm));
                    }
                    entity.setDz(dz);
                    entity.setCreateBy(userId);
                    entity.setUpdateBy(userId);
                    entity.setUpdateTime(LocalDateTime.now());
                    entity.setCreateTime(LocalDateTime.now());
                    return entity;
                }).toList();

        return this.saveBatch(entityList);
    }

    /**
     * 更新汤姆代取
     *
     * @param id       汤姆代取ID
     * @param formData 汤姆代取表单对象
     * @return
     */
    @Override
    public boolean updateTomTable(Long id, TomTableForm formData) {
        TomTable entity = tomTableConverter.toEntity(formData);
        Long userId = SecurityUtils.getUserId();
        entity.setUpdateBy(userId);
        entity.setUpdateTime(LocalDateTime.now());
        return this.updateById(entity);
    }

    /**
     * 删除汤姆代取
     *
     * @param ids 汤姆代取ID，多个以英文逗号(,)分割
     * @return
     */
    @Override
    public boolean deleteTomTables(String ids) {
        Assert.isTrue(StrUtil.isNotBlank(ids), "删除的汤姆代取数据为空");
        // 逻辑删除
        List<Long> idList = Arrays.stream(ids.split(","))
                .map(Long::parseLong)
                .toList();
        return this.removeByIds(idList);
    }

    @Override
    public List<TomTableVO> exportHzList(TomTableQuery queryParams) {
        List<TomTableVO> tomTableVOList = this.baseMapper.exportHzList(queryParams);
        if (CollUtil.isEmpty(tomTableVOList)) {
            return new ArrayList<>();
        }
        //取件码从小到大排序
        //tomTableVOList.sort(Comparator.comparing(TomTableVO::getQjm1));
        // 设置序号
        for (int i = 0; i < tomTableVOList.size(); i++) {
            tomTableVOList.get(i).setIndex(i + 1);
        }
        return tomTableVOList;
    }

    @Override
    public List<TomTableVO> exportDzList(TomTableQuery queryParams) {
        List<TomTableVO> tomTableVOList = this.baseMapper.exportDzList(queryParams);
        if (CollUtil.isEmpty(tomTableVOList)) {
            return new ArrayList<>();
        }
        // 设置序号
        for (int i = 0; i < tomTableVOList.size(); i++) {
            tomTableVOList.get(i).setIndex(i + 1);
        }
        return tomTableVOList;
    }
}
